package com.electronic.utils;

import com.electronic.domain.SealSize;
import org.apache.batik.anim.dom.SAXSVGDocumentFactory;
import org.apache.batik.util.XMLResourceDescriptor;
import org.w3c.dom.svg.SVGDocument;
import org.w3c.dom.svg.SVGSVGElement;

import java.io.ByteArrayInputStream;
import java.nio.charset.StandardCharsets;

/**
 * ISvgUtil SVG图片工具类
 */
public class ISvgUtil {

    private static final String SVN_TAG = "</svg";

    /**
     * 判断 byte[] 是否是 SVG 图片
     *
     * @param data byte[] 数据
     * @return 如果是 SVG 图片，则返回 true；否则返回 false
     */
    public static boolean isSvg(byte[] data){
        String content = new String(data, StandardCharsets.UTF_8);
        if (content.trim().toLowerCase().startsWith(SVN_TAG)) {
            return true;
        }

        try {
            getSvgDocumentFromData(data);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 从 SVG 数据中获取像素宽度和高度
     *
     * @param svgData SVG 数据的字节数组
     * @return 包含宽度和高度的浮点数数组
     * @throws Exception 如果解析 SVG 数据时发生错误则抛出异常
     */
    public static SealSize getSvgSize(byte[] svgData) throws Exception {
        // 获取 SVG 文档
        String parser = XMLResourceDescriptor.getXMLParserClassName();
        SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
        SVGDocument svgDoc = (SVGDocument) factory.createDocument(null, new ByteArrayInputStream(svgData));


        SVGSVGElement root = (SVGSVGElement) svgDoc.getDocumentElement();
        // 获取像素宽度和高度
        float width = toPixels(root.getWidth().getBaseVal().getValueInSpecifiedUnits(), root.getWidth().getBaseVal().getUnitType());
        float height = toPixels(root.getHeight().getBaseVal().getValueInSpecifiedUnits(), root.getHeight().getBaseVal().getUnitType());

        SealSize sealSize = new SealSize();
        sealSize.setWidth(width);
        sealSize.setHeight(height);
        return sealSize;
    }

    /**
     * 从 SVG 数据字符串获取 SVGDocument 对象
     *
     * @param svgData SVG 数据字符串
     * @return SVGDocument 对象
     */
    private static SVGDocument getSvgDocumentFromData(byte[] svgData) throws Exception {
        String parser = XMLResourceDescriptor.getXMLParserClassName();
        SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory(parser);
        return (SVGDocument) factory.createDocument(null, new ByteArrayInputStream(svgData));
    }

    /**
     * 将指定单位的值转换为像素值（假设 DPI 为 96）
     *
     * @param value    值大小
     * @param unitType 单位类型（如：CSS_PX、CSS_IN、CSS_CM 等）
     * @return 像素值大小
     */
    public static float toPixels(float value, short unitType) {
        switch (unitType) {
            case org.w3c.dom.css.CSSPrimitiveValue.CSS_PX:
                return value;
            case org.w3c.dom.css.CSSPrimitiveValue.CSS_IN:
                return value * 96f;
            case org.w3c.dom.css.CSSPrimitiveValue.CSS_CM:
                return value * (96f / 2.54f);
            case org.w3c.dom.css.CSSPrimitiveValue.CSS_MM:
                return value * (96f / 25.4f);
            case org.w3c.dom.css.CSSPrimitiveValue.CSS_PT:
                return value * (96f / 72f);
            case org.w3c.dom.css.CSSPrimitiveValue.CSS_PC:
                return value * (96f / 6f);
            default:
                throw new IllegalArgumentException("Unsupported unit type: " + unitType);
        }
    }
}
